//
//  RAPTextView + Extension.swift
//  COPYCAT-Weibo
//
//  Created by 闫萌 on 1/10/16.
//  Copyright © 2016 RendezvousAuParadis. All rights reserved.
//

import UIKit


private let kEmoticonInTextViewOffsetY: CGFloat = -4

extension RAPTextView {
    
    ///  让text view显示一个表情模型
    ///
    ///  - parameter emoticonModel: 表情模型
    func displayEmoticonByModel(emoticonModel: RAPEmoticonModel) {
        if emoticonModel.type == "0" { // 图片表情
            // 获取图片
            let image = UIImage(named: emoticonModel.png!, inBundle: RAPEmoticonKeyboardViewModel.sharedViewModel.emoticonBundle, compatibleWithTraitCollection: nil)
            // text attachment
            let attach = RAPTextAttachment()
            attach.emoticonModel = emoticonModel
            attach.image = image
            // 调整attachment的大小以及位置
            attach.bounds = CGRectMake(0, kEmoticonInTextViewOffsetY, (self.font?.lineHeight)!, (self.font?.lineHeight)!)
            
            /*
            获取text view当前所拥有的属性字符串，并将其转为可变。
            注意，UITextView的attributedText属性为"!"，即一定有值，
            经过测试，text负责保存unicode字符串，而attributedText负责保存带有属性描述的text所保存的字符串。
            所以不用担心一开始输入的是文字，还需要将其转换为属性字符串的问题。
            */
            let currentAttrString = self.attributedText.mutableCopy() as! NSMutableAttributedString
            // TODO: 此处光标移动位置的逻辑有待理解
            // 记录字符串拼接之前的位置
            let range = self.selectedRange
            // 在后面添加一个空字符，其附带一个attachment
            currentAttrString.replaceCharactersInRange(self.selectedRange, withAttributedString: NSAttributedString(attachment: attach))
            // 调整整个字符串的各类属性
            // 注意，textView的font不能为空
            currentAttrString.addAttribute(NSFontAttributeName, value: self.font!, range: NSMakeRange(0, currentAttrString.length))
            // 重新赋值
            self.attributedText = currentAttrString
            self.selectedRange = NSMakeRange(range.location + 1, 0)
//            RAPLog(self.selectedRange)
            
        } else { // emoji表情
            self.insertText(emoticonModel.code!)
        }
    }
    
    func emoticonCode() -> String {
        /*
        遍历text view的属性字符串，获取其中的attachment对象，options什么都不传
        */
        // 将text view现有的字符串转换为可变字符串，准备插入表情字符
        var str = ""
        /*
        反向遍历神器!!!!但是使用失败了
        因为使用这种方法会在图片文字后面插入obj
        虽然在xcode打印正常，但是发到微博上会显示obj
        暂时找不到方法去除
        */
        //        textView.attributedText.enumerateAttribute(NSAttachmentAttributeName, inRange: NSMakeRange(0, textView.attributedText.length), options: .Reverse) { (obj, range, _) -> Void in
        //            // 从后向前遍历所有 text attachment
        //            let attach = obj as? RAPTextAttachment
        //            if let opAttach = attach {
        //                str.insertString(opAttach.emoticonModel.chs!, atIndex: range.location)
        //            }
        //        }
        
        attributedText.enumerateAttributesInRange(NSMakeRange(0, self.attributedText.length), options: []) { (dict, range, _) -> Void in
            // 如果当前的字符拥有NSAttachmentAttributeName，则将这个表情的文字取出
            if let opAttach = dict[NSAttachmentAttributeName] {
                str += (opAttach as! RAPTextAttachment).emoticonCode
            } else { // 如果不是，就是一个单纯的字符串，通过range从text view的text中取出，然后添加
                str += (self.text as NSString).substringWithRange(range)
            }
        }
        // str已经包含所有字符和表情字符的混合，顺序OK
        return str
    }
}
